/*
 * 演示在代码中嵌入镜像文件
 * 如有下面的测试场景:
 *  - 做硬件模块验证时,需要图像数据作为输入
 *  - emmc测试时写入数据再读出进行对比
 *
 * 下面的示例代码演示了如何在编译代码时把image文件嵌入程序,并且在代码中访问这些文件
 */
/* C头文件，支持标准C库, 可以跨平台 */
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>


#include <tests_lib.h>
#include <io.h>
/*
 * BUILTIN_IMAGE宏在builtin-image.h中定义
 */
#include <builtin-image.h>

/*
 * 用BUILTIN_IMAGE宏声明一个image, 可以声明任意多个
 * 第一个参数为id, 后续在程序中通过该ID访问这个图像
 * 第二个参数为文件路径,使用绝对路径或相对(本工程Makefile)的路径
 */
BUILTIN_IMAGE(image1, XSTRING(tests/quick_start/res/image1.bin));
BUILTIN_IMAGE(image2, XSTRING(tests/quick_start/res/image2.bin));

static int embedded_img_run(void)
{
    uintptr_t img1_load_addr = IMAGE_ADDRESS(image1);     /* IMAGE_ADDRESS(id)获得该image的内存地址 */
    size_t img1_size = IMAGE_SIZE(image1);              /* IMAGE_SIZE(id)获得该image的大小 */
    INFO("img1_load_addr=0x%x, size=%d bytes\n", img1_load_addr, img1_size);

    uintptr_t img2_load_addr = IMAGE_ADDRESS(image2);
    size_t img2_size = IMAGE_SIZE(image2);
    INFO("img2_load_addr=0x%x, size=%d bytes\n", img2_load_addr, img2_size);

    return 0;
}

DECLARE_TEST_CASE(          /* 声明了一个单元测例, 测试框架会依次调用下面的init(), run(), exit()函数 */
        embedded_img,       /* 测例名字，不用带引号"" */
        NULL,               /* 测例预初始化函数，若不需要可以为NULL. 比如可以把复位和时钟初始化放这里 */
        embedded_img_run,   /* 测例执行主体函数，必须定义 */
        NULL                /* 测例退出函数，若不需要可以为NULL. 比如结束测例后需要关时钟 */
);
